package com.hspedu.codeblock;

/**面试题
 * 创建一个子类对象时（继承关系），调用顺序：
 * 1.父类的静态代码块和静态属性（优先级一样，按定义顺序执行）
 * 2.子类的静态代码块和静态属性（优先级一样，按定义顺序执行）
 * 3.父类的普通代码块和普通属性初始化（优先级一样，按定义顺序执行）
 * 4.父类的构造方法
 * 5.子类的普通代码块和普通属性初始化（优先级一样，按定义顺序执行）
 * 6.子类的构造方法
 *
 * 注意：静态代码块只能直接调用静态成员（静态属性和静态方法），普通代码块可以调用任意成员
 */
//父静态，子静态，父普通，父构造，子普通，子构造
public class CodeBlockDetail04 {
    public static void main(String[] args) {
        /**
         * 1.进行类的加载
         *      先加载父类，再加载子类
         * 2.创建对象
         *      从子类的构造器开始
         */
        new B02();//创建对象
    }
}

//A02父类
class A02{
    //静态属性
    private static int n1 = getVal01();

    //静态代码块
    static {
        System.out.println("父类 静态代码块");
    }
    //普通代码块
    {
        System.out.println("父类 普通代码块");
    }

    public int n3 = getVal02();
    //静态方法，调用才会执行
    public static int getVal01(){
        System.out.println("父类 静态方法");
        return 100;
    }
    //普通方法
    public int getVal02(){
        System.out.println("父类 普通方法");
        return 200;
    }
    public A02(){
        //隐藏了super();
        //普通代码块和普通属性的初始化的工作
        System.out.println("父类 构造器");
    }
}

class B02 extends A02{
    private static int n3 = getVal03();
    private int n4 = getVal04();
    static {
        System.out.println("子类 静态代码块");
    }
    {
        System.out.println("子类 普通代码块");
    }
    public static int getVal03(){
        System.out.println("子类 静态方法");
        return 300;
    }
    public int getVal04(){
        System.out.println("子类 普通方法");
        return 400;
    }
    public B02(){
        //super();//隐藏了
        //普通代码块
        System.out.println("子类 构造器");
    }
}